package br.com.velp.sudecap.serviceimpl;

import br.com.velp.sudecap.comum.ValidationException;
import br.com.velp.sudecap.dao.UsuarioDAO;
import br.com.velp.sudecap.dto.UsuarioParametrosConsultaDTO;
import br.com.velp.sudecap.entidade.DireitoSistema;
import br.com.velp.sudecap.entidade.Usuario;
import br.com.velp.sudecap.service.UsuarioService;
import br.com.velp.sudecap.util.CriptografiaUtil;
import java.util.List;
import org.hibernate.criterion.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * <sumario>
 * <objetivo> "Rastreabilidade" </objetivo>
 * <autor> EDUARDO SANTOS DE OLIVEIRA </autor>
 * <versao>1.0.0.0</versao>
 * <data_criacao> 17.10.2012 </data_criacao>
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisitos_afetados> RF001.02 - Listar Usuários / RF001.03 - Cadastrar Usuários </requisitos_afetados>
 * <descricao> Implementação da Interface Responsável Pelas Operações de 
 *             CRUD Referentes ao Contexto de Usuários </descricao>
 * </sumario>
 */
@Service("usuarioService")
@Transactional(readOnly = true)
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class UsuarioServiceImpl implements UsuarioService {
    
    public static final Long serialVersionUID = 1L;
    
    @Autowired
    private UsuarioDAO usuarioDAO;
    
    @Transactional(readOnly = false)
    @Override
    public Long salvar(Usuario usuario) throws Exception{
	validarUsuario(usuario);
	usuario.setSenha(CriptografiaUtil.criptografar(CriptografiaUtil.ALGORITMO.MD5, usuario.getSenha()));
	return this.usuarioDAO.salvar(usuario);
    }
    
    @Transactional(readOnly = false)
    @Override
    public void atualizar(Usuario usuario) throws Exception{
	validarUsuario(usuario);
	this.usuarioDAO.atualizar(usuario);
    }
    
    @Transactional(readOnly = false)
    @Override
    public void excluir(Usuario usuario){
	this.usuarioDAO.excluir(usuario);
    }
    
    @Override
    public Usuario obterPorId(Long idEmpreendimento){
	return this.usuarioDAO.obterPorId(idEmpreendimento);
    }

    @Override
    public int contarUsuarios(UsuarioParametrosConsultaDTO parametros){
	return this.usuarioDAO.contarUsuarios(parametros);
    }
    
    @Override
    public List<Usuario> buscarUsuariosPaginados(int firstResult, int maxResults, 
	    UsuarioParametrosConsultaDTO parametros, Order order){
	return this.usuarioDAO.buscarUsuariosPaginados(firstResult, maxResults, parametros, order);
    }
    
    @Override
    public Usuario recuperarUsuarioPorLoginSenha(String login, String senha){
	return this.usuarioDAO.recuperarUsuarioPorLoginSenha(login, senha);
    }
    
    @Override
    public List<DireitoSistema> recuperarPrivilegiosUsuario(Usuario usuario){
	return this.usuarioDAO.recuperarPrivilegiosUsuario(usuario);
    }
    
    private void validarUsuario(Usuario usuario) throws ValidationException {
	ValidationException ve = new ValidationException();
	if(this.usuarioDAO.usuarioJaCadastradoLogin(usuario)){
	    ve.adicionarMensagem("usuarioJaCadastradoLogin");
	}
	if(this.usuarioDAO.usuarioJaCadastradoMatricula(usuario)){
	    ve.adicionarMensagem("usuarioJaCadastradoMatricula");
	}
	if(ve.hasErros()){
	    throw ve;
	}
    }
    
}
